package net.xuele.learn.IO.nio;

/**
 * Created by GaoQingming on 2019/4/10 0010.
 *
 *
 *
 * NIO中新的概念：
 *          1、缓冲区Buffer——在NIO类库中，所有的数据都是用缓冲区处理的，读取数据是从缓冲区读取的，写数据也是写到缓冲区。任何时候访问NIO中的数据都是
 *          通过缓冲区来实现的——缓冲区实际上是一个数组，提供了对数据的结构化访问以及读写位置信息
 *
 *          2、通道Channel——网络数据通过通道读取和写入，并且它是双向的，流只能在一个方向上移动，通道支持读写同时进行。Channel一般分为两大类：
 *          网络读写的SelectableChannel和文件读写的FileChannel！
 *
 *          通道的两端是缓存区——读取数据的时候，先是调用通道的read方法将数据读取到缓冲区ByteBuffer中；
 *                            ——写数据的时候，先将数据复制到缓冲区，然后将缓冲区的数据写入到通道中;
 *                            ——缓冲区的大小和数据的大小有关的
 *
 *           模型如下：类型杠铃
 *
 *
 *          3、多路复用器selector——selector会不断的轮询注册在上面的通道Channel，如果某个通道上发生了读或写的事件，这个通道就会处理就绪状态，会被
 *          selector轮询出来，然后通过selectionKey可以获取就绪的通道集合，进行后续的IO操作（遍历就绪的通道集合）。
 *          一个多路复用器可以轮询多个通道，并且没有数量上的限制，也就意味着只需要一个线程负责selector的轮询操作。
 *
 * 开发的流程：
 *          1、打开ServerSocketChannel，监听客户端的连接，所有客户端连接的父管道
 *          2、绑定监听的端口，设置连接为非阻塞模式
 *          3、创建Reactor线程，创建多路复用器并启动线程
 *          4、将ServerSocketChannel注册到Reactor线程的多路复用器上，监听accept（连接）事件
 *          5、多路复用器在线程的run方法的无限循环体内轮询准备就绪的Key
 *          6、当多路复用器监听到有新的客户端接入，处理新的接入请求，完成TCP三次握手，建立物理链路
 *          7、设置客户端为非阻塞模式
 *          8、将新接入的客户端连接注册到Reactor线程的多路复用器上，监听读操作，读取客户端发送过来的网络消息
 *          9、异步读取客户端的消息到缓冲区
 *          10、对ByteBuffer进行编解码，如果有半包消息指针reset，继续读取后续的报文，将解码成功的消息封装成Task，
 *          投递到业务线程池，进行业务逻辑处理、
 *          11、将对象编码成ByteBuffer，调用SocketChannel的异步write接口，将消息异步发送给客户端。
 *
 */
public class TimerServer {
    public static void main(String[] args) {
        int port = 8888;
        MultipleTimeServer server = new MultipleTimeServer(port);
        // 单线程！！！
        new Thread(server,"NIO-SERVER-001").start();
    }
}
